package com.dippy.controller;


import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dippy.common.lang.Result;
import com.dippy.entity.Blog;
import com.dippy.service.BlogService;
import com.dippy.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author
 * @since 2020-10-14
 */
@RestController
@RequestMapping("/blog")
public class BlogController {

    @Autowired
    private BlogService blogService;

    /**
     *  展示博客列表，
     *      分页
     * @param currentPage 当前页。默认设置为第一页
     * @return
     */
    // @RequiresAuthentication // shiro认证，即登录才能访问
    @GetMapping("/blogs")
    public Result list(@RequestParam(defaultValue = "1") Integer currentPage) {

        // mp 分页插件
        Page page = new Page(currentPage, 5);

        // QueryWrapper分页的条件，此处为倒序，也可增加其他
        IPage pageData = blogService.page(page, new QueryWrapper<Blog>().orderByDesc("created"));

        return Result.succ(pageData);
    }

    /**
     * 单条博客
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result detail(@PathVariable(name = "id") Long id) {
        Blog blog = blogService.getById(id);

        Assert.notNull(blog,"该博客不存在");

        return Result.succ(blog);
    }


    /**
     * 需要认证才能修改、编辑 ，所以需要添加一个注解RequiresAuthentication
     *     注： @Validated 先执行判断实体类校验,
     *         即 @Validated 执行在 @RequiresAuthentication之前，
     * 修改博客
     * @param blog
     * @return
     */
    @RequiresAuthentication// shiro认证，
    @PostMapping("/edit")
    public Result edit(@Validated @RequestBody Blog blog) {

        Blog temp = null;
        // 有id 是编辑状态，没有的话添加博客状态

        //编辑
        if (blog.getId() != null) {
            // 判断是不是自己的文章，
            temp = blogService.getById(blog.getId());

            // 只能编辑自己的文章，会抛异常IllegalArgumentException
            Assert.isTrue(temp.getUserId().equals(ShiroUtil.getProfile().getId()),"没有权限编辑");
        } else {
            // 添加博客
            temp = new Blog();
            temp.setUserId(ShiroUtil.getProfile().getId());
            temp.setCreated(LocalDateTime.now());
            temp.setStatus(0);
        }
        // 把数据保存。blog => temp， id,userId...忽略的属性
        BeanUtils.copyProperties(blog,temp,"id","userId","created","status");
        // 保存数据，更新
        blogService.saveOrUpdate(temp);

        return Result.succ(null);
    }


}
